home *** CD-ROM | disk | FTP | other *** search
/ Complete Linux / Complete Linux.iso / docs / apps / database / ingres04.lzh / source / libq / IIw_left.c < prev    next >
Encoding:
C/C++ Source or Header  |  1985-02-08  |  2.5 KB  |  139 lines

  1. # include    <ingres.h>
  2. # undef MAXNAME
  3. # include    "../equel/constants.h"
  4. # include    "IIglobals.h"
  5. # include    <sccs.h>
  6. # include    <errors.h>
  7.  
  8. SCCSID(@(#)IIw_left.c    8.2    2/8/85)
  9.  
  10. /*
  11. **    IIw_left -- writes down a "tupret's" target list.
  12. **        
  13. **    Parameters:
  14. **        string -- a char * to a string containing everything
  15. **            inside the equivalent "retrieve" statement,
  16. **            but instead of result domain names, the string
  17. **            should have '%<ingres_type>', where <ingres_type>
  18. **            is the ingres type of the resulting C variable.
  19. **            To escape a '%' use 2 ("%%").
  20. **            'String' is left unchanged after the call.
  21. **        argv -- a vector of pointers to the 
  22. **            corresponding C variables.
  23. **
  24. **    Usage:
  25. **        argv [0] = &double_var;
  26. **        argv [1] = &int_var;
  27. **        IIw_left("%f8 = i.double, %i2=i.ifield", argv);
  28. **
  29. **    Required by:
  30. **        parametrized retrieves without a target relation
  31. **
  32. **    Requires:
  33. **        Uses the ret_sym array IIretsym, and the old equel
  34. **        method for doing tuprets. NOTE that this does not
  35. **        allow dynamic (before each tuple) resolution of 
  36. **        the result C variables as does the new tupret method.
  37. **
  38. **    Error numbers:
  39. **        1003 -- 1 parameter, the erroneous string.
  40. **            "Bad format for a domain in a param retrieve
  41. **            without a result relation"
  42. */
  43.  
  44.  
  45. IIw_left(string, argv)
  46. char    *string;
  47. char    **argv;
  48. {
  49.     register char    *b_st, *e_st;
  50.     register char    **av;
  51.     int        type;
  52.     char        *IIitos();
  53.  
  54.     if (IIdebug)
  55.         printf("ent IIw_left : string \"%s\"\n",
  56.         string);
  57.     av = argv;
  58.     for (b_st = e_st = string; *e_st; )
  59.     {
  60.         if (*e_st != '%')
  61.         {
  62.             e_st++;
  63.             continue;
  64.         }
  65.  
  66.         /* provide escape method */
  67.         if (e_st [1] == '%')
  68.         {
  69.             e_st [1] = '\0';
  70.             IIwrite(b_st);
  71.             /* leave string intact */
  72.             e_st [1] = '%';
  73.             b_st = e_st = &e_st [2];
  74.             continue;
  75.         }
  76.         *e_st = '\0';
  77.         IIwrite(b_st);
  78.         *e_st++ = '%';
  79.         IIwrite(" RET_VAR ");
  80.  
  81.         switch (*e_st)
  82.         {
  83.  
  84.           case 'f' :
  85.             switch (*++e_st)
  86.             {
  87.  
  88.               case '8' :
  89.                 type = opDOUBLE;
  90.                 break;
  91.  
  92.               case '4' :
  93.                 type = opFLOAT;
  94.                 break;
  95.  
  96.               default :
  97.                 goto error_label;
  98.             }
  99.             break;
  100.  
  101.           case 'i' :
  102.             switch (*++e_st)
  103.             {
  104.  
  105.               case '4' :
  106.                 type = opLONG;
  107.                 break;
  108.  
  109.               case '2' :
  110.                 type = opSHORT;
  111.                 break;
  112.  
  113.               default :
  114.                 goto error_label;
  115.             }
  116.             break;
  117.  
  118.           case 'c' :
  119.             type = opSTRING;
  120.             break;
  121.         }
  122.         IIretrieve(*av++, type);
  123.         b_st = ++e_st;
  124.     }
  125.     IIwrite(b_st);
  126.     return;
  127.  
  128.  
  129. error_label :
  130.     IIerror(BADRET, 1, &string); 
  131.     IIerrflag = 1003;
  132.     /* make sure that part already written down will
  133.      * cause an error, and ignore that error
  134.      */
  135.     IIwrite(",");
  136.     IIo_print = IIprint_err;
  137.     IIprint_err = IIno_err;
  138. }
  139.